fn main() {


    /*
    
        stack:栈

            1. 栈按照获取值的顺序存储值,并以相反的顺序删除值
            2. 操作高效,函数的作用域就是在栈上
            3. 栈上存储的所有数据都必须具有已知的固定大小数据


            存储在栈上的数据类型有：
                (1) 基础类型
                (2) tuple和array
                (3) struct和enum也是存储在栈上，如属性有String等在堆上的数据类型会指向堆



        heap: 堆

            1. 堆的规律性比较差，当你把一些东西放在你请求的堆上时,你请求，请求空间并返回一直指针，
               这是指向该位置的地址
            2. 长度可以不确定

            存储在堆上的数据类型有：

                (1) Box Rc
                (2) String和Vec等


        Box指针: 智能指针,它提供堆分配内存的所有权。它允许你将数据存储在堆上,并且复制或移动时保持
                 对数据的唯一拥有,使用box可以避免一些内存管理问题，如悬垂指针和重复释放

            1. 所有权转移
            2. 释放内存
            3. 解引用
            4. 构建递归数据结构


        Clone: 深拷贝

        Copy: Copy是在Clone的基础上建立的一个maker trait

            1. trait(特质)是一种定义共享行为的机制，clone也是特质
            2. maker trait是一个没有任何方法的trait, 它主要用于向编译器传递某些信息，以改变该类型
               的行为
    
    */ 


    // 1. 声明一个在堆上的结构体,使用智能指针实现
    let box_point = Box::new(Point{x:10,y:20});
    println!("x:{},y:{}",box_point.x, box_point.y);

    // 2. 声明一个基础类型在堆上
    let mut box_int = Box::new(100);
    println!("box_int:{}",box_int);

    // 修改数据
    *box_int += 10;
    println!("box_int:{}",box_int);


    // 3. 声明一个存储在堆上的数据
    let x = vec![1,2,3];
    // move 所有权转移
    // let y = x; 
    // 解决所有权转移,采用clone的方法
    let y = x.clone(); 
    println!("{:?}",x);
    println!("{:?}",y);


    println!("Hello, world!");
}


struct Point {
    x:i32,
    y:i32,
}